package br.unicamp.ic.sgct.client.aplicacao.usuario;

import br.unicamp.ic.sgct.client.SisGesConfTec;
import br.unicamp.ic.sgct.client.aplicacao.comum.BaseListenerImpl;
import br.unicamp.ic.sgct.client.apresentacao.widgets.MensagemUI;
import br.unicamp.ic.sgct.client.dominio.exception.InfraException;
import br.unicamp.ic.sgct.client.dominio.to.ConferenciaTO;
import br.unicamp.ic.sgct.client.dominio.to.ParticipanteTO;
import br.unicamp.ic.sgct.client.dominio.to.UsuarioTO;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import java.util.List;

/**
 * Controladora da Registrar usuario
 * 
 */
public class UsuarioListenerImpl extends BaseListenerImpl implements
        UsuarioListener {

    private UsuarioServiceAsync service = GWT.create(UsuarioService.class);

    public UsuarioListenerImpl(MensagemUI msgWidget) {
        super(msgWidget);

        // Initialize the service proxy.
        if (service == null) {
            service = GWT.create(UsuarioService.class);

            ServiceDefTarget target = (ServiceDefTarget) service;
            target.setServiceEntryPoint(SisGesConfTec.instance().getModuleRelativeURL() + UsuarioService._RELATIVE_PATH);
        }
    }

    /**
     *
     */
    @Override
    public void inscrever(UsuarioTO usuario, Long idConferencia, final HandlerInscrever handler) {
        // Set up the callback object.

        // Make the call to the service.
        service.inscrever(usuario, idConferencia, new AsyncCallback<UsuarioTO>() {

            @Override
            public void onFailure(Throwable caught) {
                handler.handleErro(caught);

            }

            @Override
            public void onSuccess(UsuarioTO usuario) {
                handler.handleSucesso(usuario);

            }
        });
    }

     /**
     *
     * @return SubmissaoServiceAsync
     */
    public UsuarioServiceAsync getService() {
        if (service == null) {
            service = GWT.create(UsuarioService.class);
            ServiceDefTarget target = (ServiceDefTarget) service;
            target.setServiceEntryPoint(SisGesConfTec.instance().getModuleRelativeURL() + UsuarioService._RELATIVE_PATH);
        }
        return service;
    }

    /**
     *
     * @return List<ConferenciaTO>
     *
     * @throws InfraException
     * @throws Exception
     */
    @Override
    public void obterUsuario(final HandlerObterUsuario handler)  {

        getService().obterUsuario(new AsyncCallback<UsuarioTO>() {

            @Override
            public void onSuccess(UsuarioTO result) {
                handler.handleSucesso(result);
            }

            @Override
            public void onFailure(Throwable caught) {
                handler.handleErro(caught);
            }
        });
    }




    @Override
    public void obterParticipanteConferencia(final ConferenciaTO to, final HandlerObterParticipanteConferencia handler)  {
        getService().obterParticipanteConferencia(to.getId(), new AsyncCallback<ParticipanteTO>() {

            @Override
            public void onFailure(Throwable caught) {
                handler.handleErro(caught);
            }

            @Override
            public void onSuccess(ParticipanteTO result) {
                handler.handleSucesso(result, to);
            }
        });
    }


    @Override
    public void obterParticipacoesConferencia(final ConferenciaTO to, final HandlerObterParticipacoesConferencia handler){
        getService().obterParticipacoesConferencia(to.getId(), new AsyncCallback<List<UsuarioTO>>() {

            @Override
            public void onFailure(Throwable caught) {
                caught.printStackTrace();
                handler.handleErro(caught);
            }

            @Override
            public void onSuccess(List<UsuarioTO> result) {
                handler.handleSucesso(result);
            }
        });
    }

    @Override
    public void obterUsername(final HandlerObterUsername handler) {
        getService().obterUsername(new AsyncCallback<String>() {
            @Override
            public void onFailure(Throwable caught) {
                handler.handleErro(caught);
            }
            @Override
            public void onSuccess(String result) {
                handler.handleSucesso(result);
            }
        });
    }

    @Override
    public void temPerfil(String perfil, final HandlerTemPerfil handler) {
        getService().temPerfil(perfil, new AsyncCallback<Boolean>() {
            @Override
            public void onFailure(Throwable caught) {
                handler.handleErro(caught);
            }
            @Override
            public void onSuccess(Boolean result) {
                handler.handleSucesso(result);
            }
        });

    }

    @Override
    public void obterParticipantesConferencia(Long idConferencia, final HandlerObterParticipantesConferencia handler) {
        getService().obterParticipantesConferencia(idConferencia, new AsyncCallback<List<ParticipanteTO>>() {
            @Override
            public void onFailure(Throwable caught) {
                handler.handleErro(caught);
            }
            @Override
            public void onSuccess(List<ParticipanteTO> result) {
                handler.handleSucesso(result);
            }
        });
    }




   @Override
    public void cancelar(UsuarioTO usuario, final HandlerCancelar handler) {
        service.cancelar(usuario, new AsyncCallback<Void>() {
            @Override
            public void onFailure(Throwable caught) {
                handler.handleErro(caught);
            }

            @Override
            public void onSuccess(Void usuario) {
                handler.handleSucesso(Boolean.TRUE);
            }
        });
    }
}
